#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include "./../../source/http/http.hpp"

const std::string baseDir = "./wwwroot";

std::string HttpReqToString(const HttpRequest& req)
{
    std::stringstream strS;
    strS << req._method << " " << req._path << " " << req._version << "\r\n";
    for (const auto& head : req._headers) {
        strS << head.first << ": " << head.second << "\r\n";
    }
    for (const auto& param : req._params) {
        strS << param.first << ": " << param.second << "\r\n";
    }
    strS << "\r\n";
    strS << req._body;
    return strS.str();
}

void get(const HttpRequest& req, HttpResponse* res)
{
    // req.HasParam("name");
    req.GetParam("name");
    res->SetContent(HttpReqToString(req));
}

void put(const HttpRequest& req, HttpResponse* res)
{
    // res->SetContent(HttpReqToString(req));
    std::string filename = baseDir + "/recv.txt";
    Util::WriteFile(filename, req._body);
}

void login(const HttpRequest& req, HttpResponse* res)
{
    res->SetContent(HttpReqToString(req));
}

void del(const HttpRequest& req, HttpResponse* res)
{
    res->SetContent(HttpReqToString(req));
}

int main()
{
    HttpServer svr(8889, 10);
    svr.SetThreadCount(3);
    svr.SetBaseDir(baseDir);
    svr.Get("/Get", get);
    svr.Put("/Put", put);
    svr.Post("/login", login);
    svr.Delete("/Delete", del);
    svr.Start();
    return 0;
}

// void SpiltTest()
// {
//     std::vector<std::string> res;
//     size_t ret = Util::Split("name=haha&oasswd=123", "&", &res);
//     std::cout << "ret = " << ret << std::endl;
//     for (auto& str : res) {
//         std::cout << "[\"" << str << "\"]" << std::endl;
//     }
// }

// void ReadFileTest()
// {
//     std::string buf;
//     Util::ReadFile("./../../source/http/http.hpp", &buf);
//     std::cout << buf << std::endl;
// }

// void WriteFileTest()
// {
//     std::string buf;
//     Util::ReadFile("./../../source/http/http.hpp", &buf);
//     if(!Util::WriteFile("./test.txt", buf)) {
//         std::cout << "Util::WriteFile ERR" << std::endl;
//     }
//     else {
//         std::cout << "Util::WriteFile DONE" << std::endl;
//     }
// }

// void EncodeTest()
// {
//     // std::string url("/login?usr=sh&passwd=c++");
//     // std::string url("/login?usr=.~~.&passwd=.....");
//     std::string url("/login?usr=%7&passwd=.....");
//     std::cout << Util::UrlEncode(url) << std::endl;
// }

// void DecodeTest()
// {
//     // std::string url("c  ");
//     std::string url("/login?usr=%7&passwd=c++");
//     // std::string url("/login?usr=.~~.&passwd=.....");
//     std::string tmp = Util::UrlEncode(url, true);
//     std::cout << "\"" << Util::UrlDecode(tmp, true) << "\"" << std::endl;
// }

// void MineTest()
// {
//     std::cout << Util::Mine("a.haha") << std::endl;
//     std::cout << Util::Mine("a.png") << std::endl;
// }

// void StatuTest()
// {
//     std::cout << Util::Statu(404) << std::endl;
//     std::cout << Util::Statu(200) << std::endl;
//     std::cout << Util::Statu(301) << std::endl;
//     std::cout << Util::Statu(302) << std::endl;
//     std::cout << Util::Statu(666) << std::endl;
// }

// void FileTypeTest()
// {
//     std::cout << Util::IsDirectory("./makefile") << std::endl;
//     std::cout << Util::IsDirectory("./../etcTest") << std::endl;
//     std::cout << Util::IsRegular("./makefile") << std::endl;
//     std::cout << Util::IsRegular("./../etcTest") << std::endl;
// }

// void PathTest()
// {
//     std::cout << Util::LegalPath("/index/index.html") << std::endl;
//     std::cout << Util::LegalPath("/index/../index.html") << std::endl;
//     std::cout << Util::LegalPath("/index/../../index.html") << std::endl;
// }

// int main()
// {
//     SpiltTest();
//     // ReadFileTest();
//     // WriteFileTest();
//     // EncodeTest();
//     // DecodeTest();
//     // MineTest();
//     // StatuTest();
//     // FileTypeTest();
//     // PathTest();
//     return 0;
// }